/*
 * @Copyright: (C) 2019 Zhang Rida. All rights reserved.
 *
 * @Author: Zhang Rida
 * @Email: 215154317@qq.com
 * @FilePath: \WEILA_4GCAT1_SDK\src\wlosal\wl_list.h
 * @Date: 2021-02-18 15:07:07
 * @Description: list for weila osal
 *
 * @LastEditors: Zhang Rida
 * @LastEditTime: 2021-03-03 16:07:58
 */

#ifndef _WL_LIST_H
#define _WL_LIST_H

#include "wl_types.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

typedef struct __wl_list_node wl_list_node;
struct __wl_list_node {
    wl_list_node* next;
    void*         element;
};

typedef struct __wl_list wl_list;
struct __wl_list {
    wl_int32      nb_elt;  //链表节点数量
    wl_list_node* node;
};

typedef struct __wl_list_iterator wl_list_iterator;
struct __wl_list_iterator {
    wl_list_node*  actual;  //当前节点
    wl_list_node** prev;    //前节点
    wl_list*       li;      //链表
    wl_int32       pos;     //索引
};

/**
 * @description: 初始化链表
 * @param list 链表句柄
 * @return 成功 0 失败 -1
 */
wl_int32 wl_list_init(OUT wl_list* list);

/**
 * @description: 释放链表
 * @param list 链表句柄
 * @return 无
 */
void wl_list_free(wl_list* list);

/**
 * @description: 释放链表
 * @param list 链表句柄
 * @param free_func 链表节点释放函数
 * @return 无
 */
void wl_list_special_free(wl_list* list, void (*free_func)(void*));

/**
 * @description: 复制链表
 * @param src 源链表句柄
 * @param dst 目的链表句柄
 * @param clone_func 复制函数 0 成功 -1 失败
 * @return 成功 0 失败 -1
 */
wl_int32 wl_list_clone(const wl_list* src, wl_list* dst, wl_int32 (*clone_func)(void*, void**));

/**
 * @description: 获取链表节点数量
 * @param list 链表句柄
 * @return 成功 链表节点数量 失败 -1
 */
wl_int32 wl_list_size(const wl_list* list);

/**
 * @description: 链表尾节点检查
 * @param list 链表句柄
 * @param pos 索引
 * @return 成功 0 是 1 不是 失败 -1 (参数异常或pos越界)
 */
wl_int32 wl_list_eol(const wl_list* list, wl_int32 pos);

/**
 * @description: 添加元素
 * @param list 链表句柄
 * @param element 元素
 * @param pos 索引(0 链表首部 -1表示链表尾部)
 * @return 成功 链表节点数量 失败 -1
 */
wl_int32 wl_list_add(wl_list* list, void* element, wl_int32 pos);

/**
 * @description: 获取链表元素
 * @param list 链表句柄
 * @param pos 索引
 * @return 成功 节点元素 失败 NULL
 */
void* wl_list_get(const wl_list* list, wl_int32 pos);

/**
 * @description: 删除链表节点
 * @param list 链表句柄
 * @param pos 索引
 * @return 成功 链表节点数量 失败 -1
 */
wl_int32 wl_list_remove(wl_list* list, wl_int32 pos);

/**
 * @description: 获取头节点元素
 * @param list 链表句柄
 * @param iterator 迭代器
 * @return 成功 节点元素 失败 NULL
 */
void* wl_list_get_first(wl_list* list, OUT wl_list_iterator* iterator);

/**
 * @description: 获取迭代器下一个节点元素
 * @param iterator 迭代器
 * @return 成功 节点元素 失败 NULL
 */
void* wl_list_get_next(wl_list_iterator* iterator);

/**
 * @description: 迭代器是否终止
 * @param iterator 迭代器
 * @return 终止 true 未终止 false
 */
wl_bool wl_list_iterator_is_end(wl_list_iterator* iterator);

/**
 * @description: 删除迭代器当前节点
 * @param iterator 迭代器
 * @return 非NULL 迭代器未终止 NULL 迭代器终止
 */
void* wl_list_iterator_remove(wl_list_iterator* iterator);

#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _WL_LIST_H */
